<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>


    <script>

        // 函数 ： 
        //    变量存储一段代码块

        //  函数其实也是一种数据类型    是一种引用数据类型

        // function sum(a, b) {
        //     return a + b
        // }


        // const fn = function() {}


        // 无论是具名函数还是赋值式函数


        //  函数声明阶段
        //     会在堆内存中开辟一块空间(地址)，存储函数中的所有的代码
        //     会在栈内存中生成一个与函数同名的变量  存储这块地址

        // 函数调用阶段
        //     根据栈内存中的地址找到堆内存中存储这段代码的地址
        //     在调用栈中开辟一块执行空间
        //     执行那个代码块(预解析，实参的接收)
        //     函数中的代码块执行完毕之后，这个执行空间就会被销毁   ???????




        //   正常情况下，函数执行完毕之后，这个执行空间将会被销毁
        //   假如函数返回了一个引用数据类型，这个执行空间就不会被销毁




        // function fn() {
        //     // const obj = { a: 1 };
        //     const a = 1
        //     return a;
        // }


        // const res = fn();
        // console.log(res);   // 得到的是一个地址




        function fn() {

            function aa() {
                console.log(1);
            }

            return aa
        }



        const res = fn();

        res();


        res()






    </script>

</body>

</html>